dup(2) | 2007-10-27-16:31 | dup(2) |
НАЗВА¶
dup, dup2 - дублює дескриптор файлу
СТИСЛИЙ ОГЛЯД¶
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
ОПИС¶
dup і dup2 створюють копію дескриптору файлу oldfd. Після успішного завершення dup або dup2, новий і старий дескриптор можуть використовуватись взаємозамінно. Вони спільно використовують ті самі замки (locks), покажчики на позицію файлу і прапорці. Прикладом, якщо позиція одного з файлів-дескрипторів помінялась завдяки lseek, це буде дійсним також і для другого дескриптору.
Два дескриптори не поділяють прапорець close-on-exec (закриття по виконанню), тим не менш.
dup використовує вільний дескриптор з найменшим порядковим номером для нового дескриптору.
dup2 створює newfd як копію oldfd, закриваючи першим newfd, якщо необхідно.
ПОВЕРНЕНЕ ЗНАЧЕННЯ¶
dup і dup2 повертають новий дескриптор, або -1, якщо виникла якась помилка (у такому випадку, errno також отримає відповідне значення).
КОДИ ПОМИЛОК¶
- EBADF
-
oldfd не являється відкритим дескриптором файлу, або newfd знаходиться поза межами дозволених дескрипторів файлів. - EMFILE
-
Процес відкрив максимально дозволену кількість дескрипторів файлів і намагається відкрити ще один. - EINTR
-
Виклик dup2 було перервано якимось сигналом. - EBUSY
-
(Тільки для Лінукса) може бути повернутим dup2 під час стану перегону (race condition) з open() або dup().
ПОПЕРЕДЖЕННЯ¶
Помилка, що повертається dup2 відрізняється від того, що повертає fcntl(..., F_DUPFD, ...), якщо newfd знаходиться поза межами дозволених дескрипторів файлів. На деяких системах, dup2 також повертає EINVAL, так само як F_DUPFD.
ВАДИ¶
Під час відкриття newfd, усі помилки, які могли би бути звітовані під час close() безнадійно втрачаються. Обережний програміст не використовуватиме dup2 без закриття newfd спочатку.
ВІДПОВІДНІСТЬ СТАНДАРТАМ¶
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4 описує додаткові стани помилок EINTR і ENOLINK. POSIX.1 додав EINTR. Повернення EBUSY є характерним лише для Лінукса.
ДИВІТЬСЯ ТАКОЖ¶
---- Переклав Віталій Цибуляк <vi@uatech.atspace.com>
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |